package com.mage.directive;

import freemarker.core.Environment;
import freemarker.ext.beans.BeansWrapper;
import freemarker.ext.beans.BeansWrapperBuilder;
import freemarker.template.*;

import java.io.IOException;
import java.io.Writer;
import java.util.Map;

/**
 * 自定义一个
 *  <@sum a=1 b=2 c=3>
 *      累加的结果：${result}
 *  </sum>
 */
public class SumDirective implements TemplateDirectiveModel {


    /**
     *
     * @param env 环境变量
     * @param params    传入参数
     * @param loopVars 循环变量
     * @param body 指令之间的模板内容
     * @throws TemplateException
     * @throws IOException
     */
    @Override
    public void execute(Environment env,
                        Map params, TemplateModel[] loopVars,
                        TemplateDirectiveBody body)
            throws TemplateException, IOException {

        // 获取参数
        if (params == null || params.size() < 1) {
            throw new TemplateModelException("请输入相关参数。");
        }

        // 处理循环变量
        for (int i=0; i < loopVars.length; i++) {
            // 给循环变量的第0和第1个值进行赋值
            loopVars[i] = new SimpleNumber(i);
        }



        // 累加
        int account = 0;
        for (Object num: params.values()) {
            account += ((SimpleNumber)num).getAsNumber().intValue();
        }
        // 输出结果
        // 通过BeansWrapper的wrap()方法将java类型装成Freemarker数据TemplateModel类型
        BeansWrapper beansWrapper = new BeansWrapperBuilder(Configuration.VERSION_2_3_29).build();
        TemplateModel result = beansWrapper.wrap(account);
        env.setVariable("result", result);
        Writer writer = env.getOut();
        if (body == null) { // 如果body为空，可以输出内容
            writer.write("<b>输出的结果为："+ result +"</b>");
        } else {
            body.render(writer);
        }

    }
}
